'use strict';
/*
  模型一定要写在app.model下
  表明一定要跟模型名称一致
*/
// 引入 crypto 加密
const crypto = require('crypto');

module.exports = app => {
  // 引入数据类型
  const { INTEGER, DATE, STRING, ENUM } = app.Sequelize;
  // 配置
  const User = app.model.define('user',{
    id:{ type: INTEGER(20).UNSIGNED, primaryKey: true, autoIncrement:true },
    username: { type: STRING(30), allowNull: false, defaultValue: '', comment: '用户名称', unique: true },
    nickname: { type: STRING(30), allowNull: false, defaultValue: '', comment: '昵称' },
    email: { type: STRING(160), comment: '用户邮箱', unique: true },
    password: { 
      type: STRING(200), 
      allowNull: false, 
      defaultValue: '', 
      // 修改器(在新增或修改的时候会调用)
      set(val){
        // 获取加密方式和密钥
        const hmac = crypto.createHash("sha256", app.config.crypto.secret);
        hmac.update(val);
        // 加密后的值
        let hash = hmac.digest("hex");
        // 写入数据库
        this.setDataValue('password', hash);
      }
    },
    avatar: { type: STRING(200), allowNull: false, defaultValue: '' },
    phone: { type: STRING(20), comment: '用户手机', unique: true },
    sex: { type: ENUM, values: ['男', '女', '保密'], allowNull: true, defaultValue: '男', comment: '用户性别'},
    status: { type: INTEGER(1), allowNull: true, defaultValue: 1, comment: '状态 0禁用 1启用'},
    sign: { type: STRING(200), allowNull: false, defaultValue: '', comment: '个性签名' },
    area: { type: STRING(200), allowNull: true, defaultValue: '', comment: '地区' },
    created_at: DATE,
    updated_at: DATE
  });

  // 定义模型关联关系
  User.associate = function(model){
    // 一对多关系
    User.hasMany(app.model.Friend, {
      // 起别名
      as: "bfriends", // 当前用户的好被友
      // 指定外键（第一个外键可以不写）
      foreignKey:'friend_id'
    });

    User.hasMany(app.model.Friend, {
      // 起别名
      as: "friends",  // 当前用户的好友
      // 指定外键（第一个外键可以不写）
      foreignKey:'user_id'
    });

    User.hasMany(app.model.Moment, {
      foreignKey:'user_id'
    });
  }

  return User
};